#!/usr/bin/env perl
require 5.008;
use warnings;
use strict;
use Digest::MD5;
use File::Copy;

unshift(@INC, '.');
require qpdf_test_helpers;

chdir("qpdf") or die "chdir testdir failed: $!\n";

require TestDriver;

cleanup();

my $td = new TestDriver('inline-images');

my $n_compare_pdfs = 0;
my $n_tests = 10;

# The file large-inline-image.pdf is a hand-crafted file with several
# inline images of various sizes including one that is two megabytes,
# encoded in base85, and has a base85-encoding that contains EI
# surrounded by delimiters several times. This exercises the EI
# detection code added in qpdf 8.4.

$td->runtest("complex inline image parsing",
             {$td->COMMAND =>
                  "qpdf --qdf --static-id large-inline-image.pdf a.pdf"},
             {$td->STRING => "", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "large-inline-image.qdf"});

$td->runtest("eof in inline image",
             {$td->COMMAND =>
                  "qpdf --qdf --static-id eof-in-inline-image.pdf a.pdf"},
             {$td->FILE => "eof-inline-qdf.out", $td->EXIT_STATUS => 3},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "eof-in-inline-image.qdf"});
$td->runtest("externalize eof in inline image",
             {$td->COMMAND =>
                  "qpdf --qdf --externalize-inline-images" .
                  " --static-id eof-in-inline-image.pdf a.pdf"},
             {$td->FILE => "eof-inline-qdf.out", $td->EXIT_STATUS => 3},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "eof-in-inline-image-ii.qdf"});
$td->runtest("externalize damaged image",
             {$td->COMMAND =>
                  "qpdf --externalize-inline-images" .
                  " --compress-streams=n --static-id" .
                  " damaged-inline-image.pdf a.pdf"},
             {$td->STRING => "", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "damaged-inline-image-out.pdf"});
$td->runtest("named colorspace",
             {$td->COMMAND =>
                  "qpdf --static-id --externalize-inline-images" .
                  " --ii-min-bytes=0 inline-image-colorspace-lookup.pdf a.pdf"},
             {$td->STRING => "", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->COMMAND => "qpdf-test-compare a.pdf inline-image-colorspace-lookup-out.pdf"},
             {$td->FILE => "inline-image-colorspace-lookup-out.pdf", $td->EXIT_STATUS => 0});


my @eii_tests = (
    ['inline-images', 80],
    ['large-inline-image', 1024],
    ['nested-form-xobjects-inline-images', 20],
    );
$n_tests += 4 * scalar(@eii_tests);
$n_compare_pdfs += 2 * scalar(@eii_tests);

foreach my $d (@eii_tests)
{
    my ($file, $threshold) = @$d;
    $td->runtest("inline image $file (all)",
                 {$td->COMMAND =>
                      "qpdf --qdf --static-id --externalize-inline-images" .
                      " --ii-min-bytes=0 $file.pdf a.pdf"},
                 {$td->STRING => "", $td->EXIT_STATUS => 0},
                 $td->NORMALIZE_NEWLINES);
    $td->runtest("check output",
                 {$td->FILE => "a.pdf"},
                 {$td->FILE => "$file-ii-all.pdf"});
    compare_pdfs($td, "$file.pdf", "a.pdf");

    $td->runtest("inline image $file (some)",
                 {$td->COMMAND =>
                      "qpdf --qdf --static-id --externalize-inline-images" .
                      " --ii-min-bytes=$threshold $file.pdf a.pdf"},
                 {$td->STRING => "", $td->EXIT_STATUS => 0},
                 $td->NORMALIZE_NEWLINES);
    $td->runtest("check output",
                 {$td->FILE => "a.pdf"},
                 {$td->FILE => "$file-ii-some.pdf"});
    compare_pdfs($td, "$file.pdf", "a.pdf");
}

cleanup();
$td->report(calc_ntests($n_tests, $n_compare_pdfs));
